#include"TCP.h"

//初始化服务器
TCP_Socket TCP_Init_Sever(in_port_t port, const char *s_addr)
{
    TCP_Socket sock;
    // ​ 1、创建套接字
    sock.sok_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock.sok_fd)
    {
        perror("socket error:");
        return sock;
    }

    // ​ 2、填充服务器网络信息结构体
    struct sockaddr_in soc_addrin;                            // 创建网络结构体
    soc_addrin.sin_family = AF_INET;                          // 结构体类型  IP4
    soc_addrin.sin_addr.s_addr = inet_addr(s_addr);           // IP地址
    soc_addrin.sin_port = htons(port);                        // 端口号
    socklen_t soc_addr_len = sizeof(soc_addrin);              // 结构体大小

    // ​ 3、将套接字与服务器的网络信息结构体绑定
    if (-1 == bind(sock.sok_fd, (struct sockaddr *)&soc_addrin, soc_addr_len))
    {
        perror("bind error:");
        exit(-1);
    }
    // ​ 4、将套接字设置城 监听状态
    if (-1 == listen(sock.sok_fd, 5))
    {
        perror("listen error:");
        exit(-1);
    }

    // ​ 5、阻塞等待客户端连接 accept
    printf("等待客户端连接....\n");
    sock.acc_fd= accept(sock.sok_fd, NULL, NULL);
    if (-1 == sock.acc_fd)
    {
        perror("accept error:");
        close(sock.sok_fd);
        exit(-1);
    }
    printf("客户端连接成功!\n");
    return sock;
}

//初始化化客户端
int TCP_Init_Client(in_port_t port, const char *s_addr)
{
    // 1、创建流式套接字
    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock_fd)
    {
        perror("socket error:");
        exit(-1);
    }

    // ​ 2、填充服务器网络信息结构体
    struct sockaddr_in sock_addr;
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_addr.s_addr = inet_addr(s_addr);
    sock_addr.sin_port = htons(port);
    int addr_len = sizeof(sock_addr);
    // ​ 3、与服务器建立连接 cnnect
    printf("等待服务器连接....\n");
    connect(sock_fd, (struct sockaddr *)&sock_addr, addr_len);
    printf("服务器连接成功....\n");
    sleep(1);

    // 返回套接字
    return sock_fd;
}

//关闭服务器/客户端
void TCP_close(TCP_Socket *TCP_Sever_sock, int *TCP_Client_sock)
{
    //关闭服务器
    if (NULL == TCP_Sever_sock)
    {
        close(TCP_Sever_sock->acc_fd);
        close(TCP_Sever_sock->sok_fd);
    }

    //关闭客户端
    if (NULL == TCP_Client_sock)
    {
        close(*TCP_Client_sock);
    }
}